package br.com.tarifador.autenticacao;

import br.com.tarifador.dao.TarifadorDao;
import br.com.tarifador.model.PerfilDeAcesso;
import br.com.tarifador.model.Usuario;
import java.sql.Connection;
import java.sql.ResultSet;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;

@ManagedBean(name = "autenticador")
@RequestScoped
public class AutenticadorBean implements UsuarioMaster {

    private Usuario usuario = new Usuario();
    ResultSet rs;
    Connection con;
    FacesContext fc = FacesContext.getCurrentInstance();
    Usuario usuarioTemp;
    TarifadorDao<Usuario> daoUser = new TarifadorDao<Usuario>(Usuario.class);
    CriptografaSenha critografa;

    public String logar() {
        critografa = new CriptografaSenha();
        usuarioTemp = new Usuario();
        boolean validaCampos;

        this.usuario.setNome(this.usuario.getNome().toUpperCase());
        this.usuario.setPassword(this.usuario.getPassword().toUpperCase());

        validaCampos = this.validaCampos(usuario);
        if (validaCampos == true) {
            try {
                if (usuario.getNome().equals(usuarioMaster.toUpperCase())
                        && usuario.getPassword().equals(senhaMaster.toUpperCase())) {
                    return CarregaPaginaMaster();
                } else {
                    usuarioTemp = daoUser.findUserDBciptografado(usuario.getNome());
                    usuarioTemp.setPassword(critografa.descriptografar(usuarioTemp.getPassword()));
                    return CarregaPagina();
                }
            } catch (NullPointerException e) {
                this.carregaMsgErro();
                return null;
            }

        } else {
            this.carregaMsgErroCampo();
        }
        return null;
    }

  //  private PerfilDeAcesso carregaPerfil(Usuario user) {
   //     TarifadorDao<PerfilDeAcesso> dao = new TarifadorDao<PerfilDeAcesso>(PerfilDeAcesso.class);
    //    PerfilDeAcesso perfil = dao.findbyString(user.ge, "senha");
        


    //}

    private String CarregaPagina() {
        if (this.usuario.getNome().equals(usuarioTemp.getNome().toUpperCase())
                && this.usuario.getPassword().equals(usuarioTemp.getPassword().toUpperCase())) {
            HttpSession sessao = (HttpSession) fc.getExternalContext().getSession(true);
            sessao.setAttribute("currentUser", usuario);
            return "homePage";
        } else {
            this.carregaMsgErro();
        }
        return null;
    }

    private String CarregaPaginaMaster() {
        HttpSession sessao = (HttpSession) fc.getExternalContext().getSession(true);
        sessao.setAttribute("currentUser", usuario);
        return "homePage";
    }

    private void carregaMsgErro() {
        limparCamposLogin();
        FacesMessage fm = new FacesMessage(" usuário e / ou senha inválidos ");
        fm.setSeverity(FacesMessage.SEVERITY_ERROR);
        fc.addMessage(null, fm);
    }

    private void carregaMsgErroCampo() {
        limparCamposLogin();
        FacesMessage fm = new FacesMessage(" Necessário preencher os campos ");
        fm.setSeverity(FacesMessage.SEVERITY_ERROR);
        fc.addMessage(null, fm);
    }

    public void registraSaida() {
        FacesContext fc = FacesContext.getCurrentInstance();
        ExternalContext ec = fc.getExternalContext();
        HttpSession session = (HttpSession) ec.getSession(false);
        session.removeAttribute("currentUser");
        session.invalidate();
    }

    public void limparCamposLogin() {
        this.usuario.setNome("");
        this.usuario.setPassword("");
    }

    private boolean validaCampos(Usuario user) {
        if ((user.getNome() != null && !user.getNome().equals("")) && (user.getPassword() != null && !user.getPassword().equals(""))) {
            return true;
        }
        return false;
    }

    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }

    public Usuario getUsuario() {
        return this.usuario;
    }
}
